package mb.kurier.webbean;

import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import mb.commons.CalendarManager;
import mb.kurier.dao.StatisticsDAO;
import mb.kurier.data.StatisticsData;

import org.apache.myfaces.trinidad.model.ChartModel;

/**
 * Klasa Managera obsługującego widok statystyk dla kuriera.
 * @author Michał Budziło
 *
 */
public class StatisticsManager extends ChartModel {

	private CalendarManager calendar;
	private String selectedTyp;
	
	private ArrayList<SelectItem> typy;
	
	private StatisticsDAO dao;
	private ArrayList<StatisticsData> list;
	private Date dataOd;
	private Date dataDo;
	private Integer type;
	private List<String> labelX;
	private Integer seriesNumber;
	private ArrayList<SelectItem> typWykresu;
	private String selectedTypWykresu;
	private boolean perspektywa;
	
	private String tytul;
	
	private ArrayList<StatisticsData> dataList;

	public StatisticsManager() {
		super();
		dao = new StatisticsDAO();
		calendar = new CalendarManager();
		typy = new ArrayList<SelectItem>();
		typWykresu = new ArrayList<SelectItem>();
		
		list = new ArrayList<StatisticsData>();
		dataList = new ArrayList<StatisticsData>();
		
		prepareLabels();
		reloadData();
	}
	
	/**
	 * Metoda przygotowuje labele osi X.
	 */
	private void prepareLabels()
	{
			Calendar teraz = Calendar.getInstance();
			Calendar przed = Calendar.getInstance();
			przed.add(Calendar.DATE, -7);
			dataOd = calendar.StringToDate(calendar.CalendarToString(przed));
			dataDo = calendar.StringToDate(calendar.CalendarToString(teraz));
		selectedTypWykresu="horizontalBar";
		selectedTyp="1";
		typy.add(new SelectItem( "1" , "wszystkie paczki"));
		typy.add(new SelectItem( "2" , "paczki dostarczone"));
		typy.add(new SelectItem("3", "paczki niedostarczone"));
		typy.add(new SelectItem("4", "przebyte kilometry"));
		
		
		typWykresu.add(new SelectItem("verticalBar","słupkowy"));
		typWykresu.add(new SelectItem("line", "liniowy"));
		typWykresu.add(new SelectItem("horizontalBar", "słupkowy horyzontalny"));
		typWykresu.add(new SelectItem("radarArea", "radar"));
		
		perspektywa=true;
	}

	/**
	 * Metoda zwraca instancję tego obiektu.
	 * @return aktualny obiekt
	 */
	public ChartModel getValue() {
		return this;
	}

	/* (non-Javadoc)
	 * @see org.apache.myfaces.trinidad.model.ChartModel#getGroupLabels()
	 */
	public List<String> getGroupLabels() {

		
		labelX = generateDateList(dataOd.toString(), dataDo.toString());
		return labelX;
	}

	/* (non-Javadoc)
	 * @see org.apache.myfaces.trinidad.model.ChartModel#getSeriesLabels()
	 */
	public List<String> getSeriesLabels() {
		reloadData();

		List<String> products = new ArrayList<String>();
		String label="";
		for( int i = 0 ; i < typy.size() ; i++)
		{
			if((typy.get(i).getValue()).equals(selectedTyp))
			{
				label = typy.get(i).getLabel();
			}
		}
		products.add(label);
		seriesNumber = products.size();
		return products;
	}

	/* (non-Javadoc)
	 * @see org.apache.myfaces.trinidad.model.ChartModel#getYValues()
	 */
	public List<List<Double>> getYValues() {

		reloadData();

		List<List<Double>> chartValues = new ArrayList<List<Double>>();
		// iterate over the groups (years...)
		int l = 0;
		int end = list.size();
		for (int i = 0; i < labelX.size(); i++) {
			List<Double> numbers = new ArrayList<Double>();

			for (int j = 0; j < seriesNumber; j++) {
					if (l <end && list.get(l)!=null && labelX.get(i).equals(list.get(l).getData().toString())) {
						numbers.add(new Double(list.get(l).getPositionY()));
						l++;
					} else {
						numbers.add(new Double(0));
					}
			}
			chartValues.add(numbers);
		}
		return chartValues;
	}


	private List<String> generateDateList(String start, String end) {
		List<String> listaDat = new ArrayList<String>();
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		Calendar cal = Calendar.getInstance();
		String t = "";
		try {
			cal.setTime(dateFormat.parse(start));
		} catch (ParseException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		while (!t.equals(end)) {

			t= calendar.CalendarToString(cal);
			listaDat.add(t);
			cal.add(Calendar.DATE, 1);
		}
		return listaDat;

	}
	public void test()
	{
	}
	
	/**
	 * Metoda pobiera dane do tabeli.
	 */
	public void save()
	{
		dataList= new ArrayList<StatisticsData>();
		dataList= dao.getData(dataOd , dataDo ,dao.getLogin() , selectedTyp );

		for( int i = 0 ; i < typy.size() ; i++)
		{
			if(((String)(typy.get(i).getValue())).equals(selectedTyp))
			{
				tytul = typy.get(i).getLabel();
				break;
			}else
			{
				tytul="";
			}
			
		}
		
		
	}
	
	
	/**
	 * Metoda wykonywana przy zmianie typu danych wykresu
	 * @param e zdarzenie
	 */
	public  void changeTyp(ActionEvent e)
	{
	}
	

	/**
	 * Metoda pobiera z bazy danych , dane do tabeli.
	 */
	public void reloadData() {
		list = dao.getData(dataOd, dataDo,dao.getLogin(), selectedTyp);
	}



	/**
	 * @return the calendar
	 */
	public CalendarManager getCalendar() {
		return calendar;
	}

	/**
	 * @param calendar the calendar to set
	 */
	public void setCalendar(CalendarManager calendar) {
		this.calendar = calendar;
	}

	/**
	 * @return the selectedTyp
	 */
	public String getSelectedTyp() {
		return selectedTyp;
	}

	/**
	 * @param selectedTyp the selectedTyp to set
	 */
	public void setSelectedTyp(String selectedTyp) {
		this.selectedTyp = selectedTyp;
	}

	/**
	 * @return the typy
	 */
	public ArrayList<SelectItem> getTypy() {
		return typy;
	}

	/**
	 * @param typy the typy to set
	 */
	public void setTypy(ArrayList<SelectItem> typy) {
		this.typy = typy;
	}

	/**
	 * @return the list
	 */
	public ArrayList<StatisticsData> getList() {
		return list;
	}

	/**
	 * @param list the list to set
	 */
	public void setList(ArrayList<StatisticsData> list) {
		this.list = list;
	}

	/**
	 * @return the dataOd
	 */
	public Date getDataOd() {
		return dataOd;
	}

	/**
	 * @param dataOd the dataOd to set
	 */
	public void setDataOd(Date dataOd) {
		this.dataOd = dataOd;
	}

	/**
	 * @return the dataDo
	 */
	public Date getDataDo() {
		return dataDo;
	}

	/**
	 * @param dataDo the dataDo to set
	 */
	public void setDataDo(Date dataDo) {
		this.dataDo = dataDo;
	}



	/**
	 * @return the type
	 */
	public Integer getType() {
		
		return type;
	}

	/**
	 * @param type the type to set
	 */
	public void setType(Integer type) {
		this.type = type;
	}

	/**
	 * @return the labelX
	 */
	public List<String> getLabelX() {
		return labelX;
	}

	/**
	 * @param labelX the labelX to set
	 */
	public void setLabelX(List<String> labelX) {
		this.labelX = labelX;
	}

	/**
	 * @return the seriesNumber
	 */
	public Integer getSeriesNumber() {
		return seriesNumber;
	}

	/**
	 * @param seriesNumber the seriesNumber to set
	 */
	public void setSeriesNumber(Integer seriesNumber) {
		this.seriesNumber = seriesNumber;
	}

	/**
	 * @return the typWykresu
	 */
	public ArrayList<SelectItem> getTypWykresu() {
		return typWykresu;
	}

	/**
	 * @param typWykresu the typWykresu to set
	 */
	public void setTypWykresu(ArrayList<SelectItem> typWykresu) {
		this.typWykresu = typWykresu;
	}

	/**
	 * @return the selectedTypWykresu
	 */
	public String getSelectedTypWykresu() {
		return selectedTypWykresu;
	}

	/**
	 * @param selectedTypWykresu the selectedTypWykresu to set
	 */
	public void setSelectedTypWykresu(String selectedTypWykresu) {
		this.selectedTypWykresu = selectedTypWykresu;
	}

	/**
	 * @return the perspektywa
	 */
	public boolean isPerspektywa() {
		return perspektywa;
	}

	/**
	 * @param perspektywa the perspektywa to set
	 */
	public void setPerspektywa(boolean perspektywa) {
		this.perspektywa = perspektywa;
	}

	/**
	 * @return the tytul
	 */
	public String getTytul() {

		return tytul;
	}

	/**
	 * @param tytul the tytul to set
	 */
	public void setTytul(String tytul) {
		this.tytul = tytul;
	}

	/**
	 * @return the dataList
	 */
	public ArrayList<StatisticsData> getDataList() {
		return dataList;
	}

	/**
	 * @param dataList the dataList to set
	 */
	public void setDataList(ArrayList<StatisticsData> dataList) {
		this.dataList = dataList;
	}


	
}
